#pragma once

// 正则表达式缓存条目个数
#define REGEXP_CACHE_MAX 16

// 正则表达式匹配和子匹配结果字符串最大长度
#define REGEXP_CAPTURE_MAX 1024

// 正则表达式匹配和子匹配结果
typedef void* regexp_capture_result_t;


#ifdef __cplusplus
extern "C" {
#endif

/**
 * 正则表达式匹配字符串
 * @param str 要匹配的字符串
 * @param pattern 正则表达式
 * @return >=0 第一个匹配的位置；<0 匹配失败
 */
int regexp_match(const char* str, const char* pattern);

/**
* 正则表达式匹配字符串，并返回匹配和子匹配结果
* @param str 要匹配的字符串
* @param offset 从什么位置开始匹配。0 表示从 str 的起始位置开始匹配。
* @param pattern 正则表达式
* @return 匹配和子匹配结果。NULL 表示未匹配。
* @attention 这个结果使用完之后必须使用 regexp_release_capture() 释放 !!!
*/
regexp_capture_result_t regexp_capture(const char* str, size_t offset, const char* pattern);

/**
* 获取匹配和子匹配字符串
* @param str 原始字符串
* @param result regexp_capture() 返回的匹配和子匹配结果
* @param idx 获取第几个匹配结果。=0 表示全局匹配结果；>0 表示子匹配结果
* @return 匹配字符串。NULL 表示无此匹配。
* @attention 返回的字符串使用了局部 static 缓冲区，最大长度为 REGEXP_CAPTURE_MAX，不用释放。但下一次调用 regexp_get_capture() 会覆盖前一次的结果，所以不是线程安全的 !!!
*/
const char* regexp_get_capture(const char* str, regexp_capture_result_t result, unsigned int idx);

/**
* 释放匹配和子匹配结果
* @param result regexp_capture() 返回的匹配和子匹配结果
*/
void regexp_release_capture(regexp_capture_result_t result);

/**
* 正则表达式匹配字符串，并返回第1个子匹配字符串
* @param str 要匹配的字符串
* @param offset 从什么位置开始匹配。0 表示从 str 的起始位置开始匹配。
* @param pattern 正则表达式
* @return 匹配和子匹配字符串。NULL 表示未匹配。
* @attention 返回的字符串使用了局部 static 缓冲区，最大长度为 REGEXP_CAPTURE_MAX，不用释放。但下一次调用 regexp_get_capture() 会覆盖前一次的结果，所以不是线程安全的 !!!
*/
const char* regexp_capture1(const char* str, size_t offset, const char* pattern);

/**
 * 初始化正则表达式缓存
 */
void regexp_cache_init();

/**
* 清除正则表达式缓存
*/
void regexp_cache_clear();


#ifdef __cplusplus
} //extern "C"
#endif
